// 链表来实现栈
// es5 没有 class 关键字
// es6 有了 class 关键字


// 一个class只能有一个constructor
// constructor 是类（class）中的一个特殊方法，用于初始化新创建的对象实例。
class ListNode {
    constructor(val) {
        //this 是一个特殊的关键字，它代表当前正在被创建或操作的那个对象实例。
        this.val = val;
        this.next = null;   //离散存储
    }
}

class LinkedListStack {
    // 类字段前面的 # 表示这是一个 私有字段（private field）。

    // 栈顶指针
    #stackPeek;
    // 栈的大小
    #size = 0;
    constructor() {
        // 初始化栈顶指针为空
        this.#stackPeek = null;
    }
    push(num) { 
        const node = new ListNode(num);
        node.next = this.#stackPeek;
        this.#stackPeek = node;
        this.#size++;
    }
    peek(){
        if(!this.#stackPeek) throw new Error('栈为空');
        return this.#stackPeek.val;
    }
    pop (){
        const num = this.peek();
        this.#stackPeek = this.#stackPeek.next;
        this.#size--;
        return num;
    }
    //get 属性
    get size(){
        return this.#size;
    }
    isEmpty(){
        return this.#size === 0;
    }
    toArray() {
        let node = this.#stackPeek;
        const res = new Array(this.size);
        for (let i = res.length - 1; i>=0;i--) {
            res[i] = node.val;
            node = node.next;
        }
        return res;
    }
    }
    //只能在类的内部访问，封装实现的细节
    //不能在类外部读取或修改， 保护类不被随意修改
    //不会被继承（子类也无法直接访问）


const stack = new LinkedListStack();
console.log(stack.size);